package br.sc.senai.model;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import br.sc.senai.model.Cliente;

public class ClienteTableModel extends AbstractTableModel {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static final int COL_NOME = 0;
	private static final int COL_CPFCNPJ = 1;
	private static final int COL_ENDERECO = 2;
	private static final int COL_TELEFONE = 3;
	private static final int COL_EMAIL = 4;

	private List<Cliente> valores;

	// Esse é um construtor, que recebe a nossa lista de clientes
	public ClienteTableModel() {
	}
	public ClienteTableModel(List<Cliente> valores) {
		this.valores = new ArrayList<Cliente>(valores);
	}

	public int getRowCount() {
		// Quantas linhas tem sua tabela? Uma para cada item da lista.
		return valores.size();
	}

	public int getColumnCount() {
		// Quantas colunas tem a tabela? Nesse exemplo, só 2.
		return 5;
	}

	public String getColumnName(int column) {
		// Qual é o nome das nossas colunas?
		if (column == COL_NOME)
			return "Nome";
		if (column == COL_CPFCNPJ)
			return "CPF/CNPJ";
		if (column == COL_ENDERECO)
			return "Endereco";
		if (column == COL_TELEFONE)
			return "Telefone";
		if (column == COL_EMAIL)
			return "E-mail";
		return ""; // Nunca deve ocorrer
	}

	public Object getValueAt(int row, int column) {
		// Precisamos retornar o valor da coluna column e da linha row.
		Cliente cliente = valores.get(row);
		if (column == COL_NOME) {
			return cliente.getNome();
		} else if (column == COL_CPFCNPJ) {
			if (cliente.getCpf() != null) {
				return cliente.getCpf();
			} else {
				return cliente.getCnpj();
			}
		} else if (column == COL_ENDERECO) {
			return cliente.getEndereco();
		} else if (column == COL_TELEFONE) {
			return cliente.getTelefone();
		} else if (column == COL_EMAIL) {
			return cliente.getEmail();
		}
		return ""; // Nunca deve ocorrer
	}

	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
		Cliente cliente = valores.get(rowIndex);
		// Vamos alterar o valor da coluna columnIndex na linha rowIndex com o
		// valor aValue passado no parâmetro.
		// Note que vc poderia alterar 2 campos ao invés de um só.
		if (columnIndex == COL_NOME){
			cliente.setNome(aValue.toString());
		} else if (columnIndex == COL_CPFCNPJ){
			if (cliente.getCpf() != null) {
				cliente.setCpf(aValue.toString());
			} else {
				cliente.setCnpj(aValue.toString());
			}
		}else if (columnIndex == COL_ENDERECO){
			cliente.setEndereco(aValue.toString());
		}else if (columnIndex == COL_TELEFONE){
			cliente.setTelefone(aValue.toString());
		}else if (columnIndex == COL_EMAIL){
			cliente.setEmail(aValue.toString());
		}
	}

	public Class<?> getColumnClass(int columnIndex) {
		// Qual a classe das nossas colunas? Como estamos exibindo texto, é
		// string.
		return String.class;
	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	// Já que esse tableModel é de clientes, vamos fazer um get que retorne um
	// objeto cliente inteiro.
	// Isso elimina a necessidade de chamar o getValueAt() nas telas.
	public Cliente get(int row) {
		return valores.get(row);
	}
}